[微信小程序开发]云数据库排障:找不到函数?访问无权限?

date
Mar 29, 2022
slug
[微信小程序开发]云数据库排障:找不到函数?访问无权限?
status
Published
tags
JavaScript
微信小程序
summary
type
Post

场景

这两天写了一个小程序,用到了云开发的云函数和数据库。对于个人开发者,玩一下技术还是十分方便的,而且入门套餐是免费的:免服务器、免运维,值得试一试。
其间遇到两个小问题,却花费了挺多时间去处理,确实有点浪费,这里记录下来,供大家参考。

故障一:访问无权限

报错信息:-502003 database permission denied | errMsg: Permission denied.
  1. 看到这个错误,我马上去检查了一下数据库配置,新建表的默认权限是:仅创建者可读写,数据是我创建的,应该没问题啊?我抱着试试看的想法,把权限改为:所有用户可读,仅创建者可读写。还是不行。
  1. 遇事不决查文档,内置权限规则这样解释的:
    1. 💡
      以下摘录自微信开发文档
      1. 当权限为 "仅创建者可读写" 时,查询时会默认给查询条件加上一条 _openid 必须等于用户 openid.
      1. 当权限为 "仅创建者可读写" 或 "所有用户可读,仅创建者可写" 时,更新前会默认先带上 _openid 必须等于用户 openid 的查询条件,再将查询到的结果进行更新,即使是用 doc.update 也是如此(因此我们会见到即使我们没有对应 _id 的记录的访问权限,但是更新操作不会失败,只会在返回的结果中说明 updated 更新的记录数量为 0)。
      1. 创建记录时,会自动给记录加上 _openid 字段,值等于用户 openid,并且不允许用户在创建记录时尝试设置 _openid.
      1. 更新记录时,不允许修改 _openid.
  1. 根据上面的文档,理论上我改过权限配置之后是没问题的,保险起见我还是给数据记录增加了 _openid 字段,并填入我的 openid ,然而还是不行:-I。
  1. 去谷歌碰碰运气,翻了好几页,发现有位同仁遇到同样的问题,并分享了解决方法:原来是因为 aggregate查询不能在客户端使用,必须在云函数中使用。
  1. 总结一下:阅读 API 文档很重要!

故障二:找不到函数

报错信息:db.getCollection(...).aggregate is not a function.
排查过程
💡
强烈推荐大家在开发云函数过程使用本地调试,可以本地小程序触发或手工出发。
  1. 第一反应是:是不是拼写错误,来回检查了几遍,排除(这里要说一下:如果有 IDE 语法提示,就不存在这个问题,TypeScript 这么火是有道理的)。
  1. 不是拼写,那就单步跟踪一下好了,发现 db.getCollection(...) 这里有返回,但是对象上面没有挂 aggregate 方法。
  1. 大致能判断出来了,是 sdk 版本问题,去检查一下 package.json,版本是 lasted,也没问题。到这里,很多人可能就会疑惑了:怎么回事?往下看!
  1. 接下来就必须去验明正身了,打开 node_modules文件夹,找到 wx-server-sdk 文件夹,查看package.json,发现版本不对,问题就在这里了!
  1. 但是为什么 package.json 中版本正常,安装就不对了呢?有经验的同学肯定会想到 lock 文件,我想起来这个云函数是复制项目模版的,检查一下 yarn.lock ,果然是这个问题,删掉重装一下,至此问题解决!
 

© XieZhichao 2022 - 2024